package site.hanzhe.did;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import site.hanzhe.did.entity.DockerImage;
import site.hanzhe.did.entity.DockerManifest;
import site.hanzhe.did.entity.Platform;
import site.hanzhe.did.utils.ConfigUtil;
import site.hanzhe.did.utils.InputUtil;
import site.hanzhe.did.utils.RequestUtil;

import java.util.List;

public class Application {

    public static void main(String[] args) {
        // 项目初始化，初始化Docker信息，初始化授权信息
        Console.log("欢迎使用 Docker 镜像下载工具 did-tool (Docker image download tool)");
        ConfigUtil.initialize();
        ConfigUtil.initDocker(InputUtil.string("请输入您要下载的镜像："));
        RequestUtil.initAuthDetails();

        // 获取Docker清单信息
        DockerManifest dockerManifest = RequestUtil.getDockerManifest();
        // 选择平台架构
        Platform platform = selectPlatform(dockerManifest);
        // 获取Docker镜像信息
        DockerImage dockerImage = RequestUtil.getDockerImage(platform);
        // 下载镜像摘要文件 xxx.json
        RequestUtil.downloadConfig(dockerImage);
        // 下载分层压缩包 xxx.tar
        RequestUtil.downloadLayers(dockerImage);
        // 生成镜像描述文件
        RequestUtil.createManifestJson(dockerImage);
        // 生成repositories文件
        RequestUtil.createRepositoriesFile();
        // 合并每个分层最终形成镜像tar文件
        RequestUtil.createTarFile();
    }

    /**
     * 选择平台架构
     *
     * @author 张涵哲
     * @since 2024-06-14 19:36:24
     */
    private static Platform selectPlatform(DockerManifest dockerManifest) {
        // 获取架构列表
        List<Platform> platforms = dockerManifest.getPlatforms();
        if (CollUtil.isEmpty(platforms)) {
            Console.log("该镜像没找到可用的平台架构，如有疑问请联系作者");
            System.exit(0);
        }
        if (platforms.size() == 1) {
            InputUtil.string("该镜像仅找到一个有效平台架构 " + platforms + "，是否继续下载(y/n)");
            return CollUtil.getFirst(platforms);
        }
        for (int index = 0; index < platforms.size(); index++) {
            Platform platform = platforms.get(index);
            Console.log("[{}] {}", index + 1, platform);
        }
        String number = InputUtil.string("该镜像共找到" + platforms.size() + "个可选择的平台架构，请输入编号选择下载的目标架构：");
        while (true) {
            if (StrUtil.isNumeric(number)) {
                int index = Integer.parseInt(number) - 1;
                if (index >= 0 && index < platforms.size()) {
                    Platform platform = platforms.get(index);
                    Console.log("您选择的平台架构是：{}", platform);
                    return platform;
                }
            }
            number = InputUtil.string("您输入的编号有误，请重新输入");
        }
    }

}